#通过列表生成式，我们可以直接创建一个列表。
# 但是，受到内存限制，列表容量肯定是有限的。
# 而且，创建一个包含100万个元素的列表，不仅占用很大的存储空间，
# 如果我们仅仅需要访问前面几个元素，那后面绝大多数元素占用的空间都白白浪费了。

# 所以，如果列表元素可以按照某种算法推算出来，
# 那我们是否可以在循环的过程中不断推算出后续的元素呢？
# 这样就不必创建完整的list，从而节省大量的空间。
# 在Python中，这种一边循环一边计算的机制，称为生成器：generator。

#要创建一个generator，有很多种方法。第一种方法很简单，只要把一个列表生成式的[]改成()，就创建了一个generator

list1=[x*x for x in range(1,10)]

print(list1)

#generator

generator1=(x*x for x in range(1,10))

for g in generator1:
    print(g)

#斐波那契数列
def fibna(n):
    i,a,b=0,0,1
    while i<n:
        print(b)
        a,b=b,a+b
        i=i+1
    return 'done'

fibna(6)

#遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行


#斐波那契数列 generator
def fibna_gen(n):
    i,a,b=0,0,1
    while i<n:
        yield b #yield会返回b的值
        a,b=b,a+b
        i=i+1
    return 'done'

print(fibna_gen(6))

for f in fibna_gen(6):
    print(f)


